/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Dao;

import Pojo.Aluno;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

/**
 *
 * @author thiago
 */
public class AlunoDaoImplJPA implements AlunoDao{
        /**
	 * Adicionar um Aluno ao banco de dados de Alunos
	 * @param aluno
	 * @return true ou false indicando sucesso ou não
	 */
	public boolean inserir(Aluno aluno){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            try{
                tx.begin();
                em.persist(aluno);
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(false);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(true);
        }
        
         /**
	 * Remover Aluno do banco ce dados de Alunos
	 * @param aluno
	 * @return true ou false indicando sucesso ou não
	 */
	public boolean remover(Aluno aluno){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            try{
                tx.begin();
                Aluno alunoAux = em.find(Aluno.class, aluno.getId());
                em.remove(alunoAux);
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(false);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(true);
        }
        
         /**
	 * alterar Aluno do banco de dados de Alunos
	 * @param aluno
	 * @return true ou false indicando sucesso ou não
	 */
         public boolean alterar(Aluno aluno){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            try{
                tx.begin();
                em.merge(aluno);
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(false);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(true);
         }
         
         /**
         * Busca todos os alunos do banco de dados
         * @return Lista de Alunos
         */
         public List<Aluno> pesquisarTodos(){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            List<Aluno> listaAlunos = null;
            try{
                tx.begin();
                Query query = em.createQuery("select a from Aluno a");
                listaAlunos = query.getResultList();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(listaAlunos);
         }
         
         /**
	 * Pesquisa de Alunos passando o cpf
	 * @param cpf
	 * @return Aluno cujo cpf é o que foi passado, ou um null indicando que nenhum aluno foi encontrado
	 */       
	public Aluno pesquisarPorCpf(String cpf){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            Aluno aluno = null;
            try{
                tx.begin();
                Query query = em.createQuery("select a from Aluno a where a.cpf= :cpf");
                query.setParameter("cpf", cpf);
                aluno = (Aluno) query.getSingleResult();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(aluno);
        }
        
        /**
	 * Pesquisa de Alunos passando o nome
	 * @param nome
	 * @return Lista de Alunos cujos nomes são iguais ao que foi passado por parâmetro. 
	 * Essa lista pode não ter nenhum Aluno, o que indica que a pesquisa não encontrou ninguém.
	 */
	public List<Aluno> pesquisarPorNome(String nome){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            List<Aluno> listaAlunos = null;
            try{
                tx.begin();
                Query query = em.createQuery("select a from Aluno a where a.nome= :nome");
                query.setParameter("nome", nome);
                listaAlunos = query.getResultList();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(listaAlunos);
        }
        
        /**
	 * Pesquisa de Alunos passando o id
	 * @param nome
	 * @return Aluno cujo id é igual ao id passado 
	 * Pode retornar nulo quando o id não está no banco de dados
	 */
	public Aluno pesquisarPorId(int id){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            Aluno aluno = null;
            try{
                tx.begin();
                Query query = em.createQuery("select a from Aluno a where a.id= :id");
                query.setParameter("id", id);
                aluno = (Aluno) query.getSingleResult();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(aluno);
        }
}
